using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Data;


namespace CapaAccesoDatos.Clases
{
    class DiaCAD 
    {
        //-------------------------------------------------------------------------------//
        // Propiedades de la Clase.                                                      //
        //-------------------------------------------------------------------------------//
        private int id;
        private string descripcion;

        //-------------------------------------------------------------------------------//
        // Accesores publicos de la Clase.                                               //
        //-------------------------------------------------------------------------------//
        private int Id 
        {
            get { return this.id; }
        }
        private string Descripcion 
        {
            get { return this.descripcion; }
        }

        //-------------------------------------------------------------------------------//
        // Constructores de la Clase.                                                    //
        //-------------------------------------------------------------------------------//
        private DiaCAD(int Id, string Descripcion) 
        {
            this.id = Id;
            this.descripcion = Descripcion;
        }

        private static void EjecutarQuery(SqlConnection conn, SqlCommand com)
        {
            //intento abrir la conexion, y si puedo, inserto los datos, sino tira una exepcion con
            //el problema
            SqlTransaction trans = null;
            try
            {
                //abro, inicio la transaccion, asigno la transaccion al comando y ejecuto el query.
                conn.Open();
                trans = conn.BeginTransaction();
                com.Transaction = trans;
                com.ExecuteNonQuery();

                trans.Commit();
            }
            catch (Exception Ex)
            {
                //si no se pudo hacer lo de arriba, devuelvo todo y tiro la excepcion
                trans.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: DiasCAD.EjecutarQuery(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally //cierro y limpio todo.
            {
                conn.Close();
                com.Dispose();
                conn.Dispose();
            }
        }

        //-------------------------------------------------------------------------------//
        // Estos son los metodos de la interface                                         //
        //-------------------------------------------------------------------------------//
        public static void Save(DiaCAD Objeto)
        {
            String SqlCommand = "INSERT INTO " + Constantes.Tablas.Dias.Nombre + "(" +
                                Constantes.Tablas.Dias.Campo_Id + ", " +
                                Constantes.Tablas.Dias.Campo_Descripcion +
                                ") VALUES (" + Objeto.Id.ToString() + ", '" + Objeto.Descripcion + "')";
            //Sentencia:   
            /* INSERT INTO Tabla (Columna1, Columna2...)        
             * VALUES (Registro1, Registro2....);*/

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();              
                Tx = Conexion.BeginTransaction();                
                Comando.Transaction = Tx;         
                Comando.ExecuteNonQuery();            
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: DiasCAD.Save(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {                
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }
        public static void Update(DiaCAD Objeto)
        {
            String SqlCommand = "UPDATE " + Constantes.Tablas.Dias.Nombre + " SET " +
                                Constantes.Tablas.Dias.Campo_Id + "=" + Objeto.Id.ToString() + ", " +
                                Constantes.Tablas.Dias.Campo_Descripcion + "='" + Objeto.Descripcion +                                 
                                "' WHERE " + Constantes.Tablas.Dias.Campo_Id + "=" + Objeto.Id.ToString();
            // Sentencia:
            /* UPDATE Tabla SET Columna1 = valor1, Columna2 = valor2 ...
             * WHERE Id = ObjetoId;*/

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();               
                Tx = Conexion.BeginTransaction();                
                Comando.Transaction = Tx;         
                Comando.ExecuteNonQuery();              
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: DiasCAD.Update(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {              
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }
        public static void Delete(DiaCAD Objeto)
        {
            String SqlCommand = "DELETE FROM " + Constantes.Tablas.Dias.Nombre + " WHERE "
                                + Constantes.Tablas.Dias.Campo_Id + "= " + Objeto.Id.ToString();

            SqlConnection Conexion = new SqlConnection(Constantes.ConnectionString);
            SqlCommand Comando = new SqlCommand(SqlCommand, Conexion);
            SqlTransaction Tx = null;

            try
            {
                Conexion.Open();               
                Tx = Conexion.BeginTransaction();             
                Comando.Transaction = Tx;         
                Comando.ExecuteNonQuery();           
                Tx.Commit();
            }
            catch (Exception Ex)
            {
                Tx.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: DiasCAD.Delete(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {              
                Conexion.Close();
                Comando.Dispose();
                Conexion.Dispose();
            }
            return;
        }

        //-------------------------------------------------------------------------------//
        // Estos son los metodos especiales para el uso de la Capa de Lenguaje de Negocios
        //-------------------------------------------------------------------------------//
        public static List<DiaCAD> Lista()
        {           
            DiaCAD result = null;
            List<DiaCAD> lista = new List<DiaCAD>();
            string sqlCMD = "SELECT * FROM " + Constantes.Tablas.Dias.Nombre;

            SqlConnection connection = new SqlConnection(Constantes.ConnectionString);
            SqlCommand command = new SqlCommand(sqlCMD, connection);
            SqlDataReader cursor = null;
            SqlTransaction transaccion = null;

            try
            {
                connection.Open();
                transaccion = connection.BeginTransaction();
                command.Transaction = transaccion;
                cursor = command.ExecuteReader(CommandBehavior.Default);
                
                while (cursor.Read() != false)
                {
                    result = new DiaCAD(Convert.ToInt32 (cursor[Constantes.Tablas.Dias.Campo_Id]),
                                         Convert.ToString (cursor[Constantes.Tablas.Dias.Campo_Descripcion]));
                    lista.Add(result);
                }
                
                cursor.Close();
                transaccion.Commit();
            }
            catch (Exception Ex)
            {                      
                cursor.Close();
                transaccion.Rollback();
                throw new System.Exception("ERROR: Se ha producido un error en la conexion con la base de datos.\n " +
                           "FUNCION: DiasCAD.Lista(<args>)\n " +
                           "INNEREXCEPT:" + Ex.Message, Ex);
            }
            finally
            {
                connection.Close();
                command.Dispose();
                connection.Dispose();
            }
            return lista;
        }
    }
}